package initialize

import (
	"fmt"
	"gin-vue-admin/global"
	"gin-vue-admin/model/migrate"
	"gin-vue-admin/utils"
	"log"
	"os"

	"gorm.io/driver/mysql"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

// InitDatabase 初始化数据库连接
func InitDatabase() {
	var err error

	// 根据配置选择数据库类型
	switch global.CONFIG.DataSource.DbType {
	case "mysql":
		global.DB, err = initMysql()
		migrate.RegisterTables()
		migrate.RegisterBizTables()
	case "sqlite":
		global.DB, err = initSqlite()
		migrate.RegisterTables()
		migrate.RegisterBizTables()
	default:
		panic(fmt.Sprintf("不支持的数据库类型: %s", global.CONFIG.DataSource.DbType))
	}

	if err != nil {
		panic(fmt.Sprintf("数据库连接失败: %v", err))
	}

	// 设置连接池参数
	sqlDB, err := global.DB.DB()
	if err != nil {
		panic(fmt.Sprintf("获取数据库实例失败: %v", err))
	}

	// 设置连接池参数
	sqlDB.SetMaxIdleConns(10)  // 最大空闲连接数
	sqlDB.SetMaxOpenConns(100) // 最大打开连接数

	log.Printf("数据库连接成功，类型: %s", global.CONFIG.DataSource.DbType)
}

// initMysql 初始化MySQL数据库
func initMysql() (*gorm.DB, error) {
	mysqlConfig := global.CONFIG.DataSource.Mysql
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		mysqlConfig.Username,
		mysqlConfig.Password,
		mysqlConfig.Host,
		mysqlConfig.Port,
		mysqlConfig.Database,
	)

	return gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info),
	})
}

// initSqlite 初始化SQLite数据库
func initSqlite() (*gorm.DB, error) {
	sqliteConfig := global.CONFIG.DataSource.Sqlite

	// 确保目录存在
	dir := utils.GetDirPath(sqliteConfig.Path)
	if err := os.MkdirAll(dir, 0755); err != nil {
		return nil, fmt.Errorf("创建SQLite目录失败: %v", err)
	}

	return gorm.Open(sqlite.Open(sqliteConfig.Path), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info),
	})
}
